package conf

// Config 配置
type Config struct {
	App    *App    `json:"app" mapstructure:"app"`
	Gin    *Gin    `json:"gin" mapstructure:"gin"`
	Doc    *Doc    `json:"doc" mapstructure:"doc"`
	Logger *Logger `json:"logger" mapstructure:"logger"`
	Redis  *Redis  `json:"redis" mapstructure:"redis"`
	Mysql  *Mysql  `json:"mysql" mapstructure:"mysql"`
	Login  *Login  `json:"login" mapstructure:"login"`
	RPC    *RPC    `json:"rpc" mapstructure:"rpc"`
	Trace  *Trace  `json:"trace" mapstructure:"trace"`
}

type AppEnv string

const (
	Dev  AppEnv = "dev"  // 测试
	Pre  AppEnv = "pre"  // 预发
	Prod AppEnv = "prod" // 生产
)

// App 服务相关
type App struct {
	AppID     string `json:"app_id" mapstructure:"app_id"`         // 服务标识符
	MachineID int    `json:"machine_id" mapstructure:"machine_id"` // 服务机器id
	AppName   string `json:"app_name" mapstructure:"app_name"`     // 服务名称
	AppDesc   string `json:"app_desc" mapstructure:"app_desc"`     // 服务描述
	AppEnv    AppEnv `json:"app_env" mapstructure:"app_env"`       // 服务环境变量
	IsProd    bool   `json:"is_prod" mapstructure:"is_prod"`       // 是否生产环境
}

// Gin gin框架配置
type Gin struct {
	Mode string `json:"mode" mapstructure:"mode"` // 模式：debug|release|test
	Port int32  `json:"port" mapstructure:"port"` // 端口
}

// Doc 文档配置
type Doc struct {
	Port   int32  `json:"port" mapstructure:"port"`     // 端口
	Dir    string `json:"dir" mapstructure:"dir"`       // 地址
	Enable bool   `json:"enable" mapstructure:"enable"` // 是否开启
}

// Logger 日志配置
type Logger struct {
	Level    LoggerLevel `json:"level" mapstructure:"level"`
	Debug    bool        `json:"debug" mapstructure:"debug"`
	FilePath string      `json:"file_path" mapstructure:"file_path"`
	TraceKey []string    `json:"trace_key" mapstructure:"trace_key"`
}
type LoggerLevel string

const (
	DEBUG LoggerLevel = "debug"
	INFO  LoggerLevel = "info"
	WARN  LoggerLevel = "warn"
	ERROR LoggerLevel = "error"
	FATAL LoggerLevel = "fatal"
)

// RPC gRPC地址
type RPC struct {
	PbAddr string `json:"pb_addr" mapstructure:"pb_addr"`
}

// Login 登录配置
type Login struct {
	SignKey     string `json:"sign_key" mapstructure:"sign_key"`         // 密钥
	Host        string `json:"host" mapstructure:"host"`                 // 地址
	Port        int    `json:"port" mapstructure:"port"`                 // 端口
	Password    string `json:"password" mapstructure:"password"`         // 密码
	DB          int    `json:"db" mapstructure:"db"`                     // DB
	ExpiresTime int    `json:"expires_time" mapstructure:"expires_time"` // 过期时间(秒)
	Issuer      string `json:"issuer" mapstructure:"issuer"`             // 签名颁发者
}

// Redis redis配置
type Redis struct {
	Host     string `json:"host" mapstructure:"host"`         // 地址
	Port     int    `json:"port" mapstructure:"port"`         // 端口
	Password string `json:"password" mapstructure:"password"` // 密码
	MaxIdle  int    `json:"max_idle" mapstructure:"max_idle"` // 最大空闲数
	DB       int    `json:"db" mapstructure:"db"`             // DB
}

// Mysql 数据库
type Mysql struct {
	URL     string `json:"url" mapstructure:"url"`           // 数据库连接
	MaxIdle int    `json:"max_idle" mapstructure:"max_idle"` // 最大连接数
	ShowSQL bool   `json:"show_sql" mapstructure:"show_sql"` // 是否打印sql
}

// Trace 链路追踪
type Trace struct {
	TraceKey string `json:"trace_key" mapstructure:"trace_key"`
}
